home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 101-125 / 105 / bison / calc.y < prev    next >
Text File  |  1995-03-13  |  2KB  |  117 lines

  1. %{
  2. #include <ctype.h>
  3.  
  4. int regs[26];
  5. int base;
  6.  
  7. int val;
  8. int printflag;
  9.  
  10. %}
  11.  
  12. %start stmt
  13.  
  14. %token DIGIT LETTER EXIT
  15.  
  16. %left '|'
  17. %left '&'
  18. %left '+' '-'
  19. %left '*' '/' '%'
  20. %left UMINUS
  21.  
  22. %%
  23.  
  24. stmt    :    expr
  25.             { val = $1; printflag = 1; }
  26.     |     LETTER '=' expr
  27.             { regs[$1] = $3; }
  28.     |    EXIT
  29.             { exit(0); }
  30.     ;
  31.  
  32. expr    :    '(' expr ')'
  33.             { $$ = $2; }
  34.     |    expr '+' expr
  35.             { if ($1 == 69)
  36.                 {
  37.                   $$ = 2;
  38.                   printf ("$1 became %d\n", $1);
  39.                   $1 = 69;
  40.                 }
  41.               $$ = $1 + $3; }
  42.     |    expr '-' expr
  43.             { $$ = $1 - $3; }
  44.     |    expr '*' expr
  45.             { $$ = $1 * $3; }
  46.     |    expr '/' expr
  47.             { $$ = $1 / $3; }
  48.     |    expr '%' expr
  49.             { $$ = $1 % $3; }
  50.     |    expr '|' expr
  51.             { $$ = $1 | $3; }
  52.     |    expr '&' expr
  53.             { $$ = $1 & $3; }
  54.     |    '-' expr %prec UMINUS
  55.             { $$ = - $2; }
  56.     |    LETTER
  57.             { $$ = regs[$1]; }
  58.     |    number
  59. /*     |    '?'
  60.             { yydebug = !yydebug; }
  61. */    ;
  62.  
  63. number    :    DIGIT
  64.             { $$ = $1;  base = ($1 == 0) ? 8 : 10; }
  65.     |    number DIGIT
  66.             { $$ = base * $1 + $2; }
  67.     ;
  68.  
  69. %%
  70.  
  71. static int eol;
  72.  
  73. int
  74. yylex()
  75. {
  76.   int c;
  77.  
  78.   while ( (c=getchar()) == ' ') {}
  79.   if (c == '\n')
  80.     { eol = 1;
  81.       return 0; }
  82.   if (c == 'Q')
  83.     return(EXIT);
  84.   if (islower(c))
  85.     {
  86.       yylval = c - 'a';
  87.       return (LETTER);
  88.     }
  89.   if (isdigit(c))
  90.     {
  91.       yylval = c - '0';
  92.       return (DIGIT);
  93.     }
  94.   return (c);
  95. }
  96.  
  97. yyerror(s)
  98. char *s;
  99. {
  100.   printf("%s\n", s);
  101. }
  102.  
  103. main()
  104. {
  105.   for (;;)
  106.     {
  107.       eol = 0;
  108.       printflag = 0;
  109.  
  110.       if (yyparse()) printflag = 0;
  111.  
  112.       if (printflag) printf("%d\n", val);
  113.  
  114.       while (!eol) yylex();
  115.     }
  116. }
  117.